/**
 * 作者：
 * 创建时间：2012-7-3 上午10:19:56
 */
package dragon.model.bizObject;

import java.sql.Date;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import dragon.core.db.DBUtil;
import dragon.core.db.DML;
import dragon.core.exception.ExceptionHandler;
import dragon.core.util.DateUtils;
import dragon.core.util.FileHandler;
import dragon.core.util.StringUtils;
import dragon.model.fieldTemplate.FieldTemplate;
import dragon.model.fieldTemplate.FieldTemplateType;
import dragon.model.file.SysFile;
import dragon.model.intercept.Interceptor;
import dragon.model.table.DataType;
import ejp.Database;
import ejw.ServerInterface;

/**
 * 处理业务模型数据<br>
 * 向视图层提供数据，实现视图层数据的持久化
 */
public class BizObjectDataService {

	/**
	 * 日志对象
	 */
	Logger logger = LoggerFactory.getLogger(BizObjectDataService.class);

	/**
	 * 添加数据前先初始化数据
	 * 
	 * @param parameterMap
	 *            参数对象，Map<String,String>,k:参数名，v:参数值
	 * @return
	 * @throws ExceptionHandler
	 */
	public void preAdd(BizObject bizObject, Map<String, String> parameterMap, ServerInterface sif) throws ExceptionHandler {
		if (logger.isDebugEnabled()) {
			logger.debug("[preAdd]\n" + parameterMap + "\n");
		}

		// preAdd前置动作 beforePreAdd
		int result = Interceptor.INCLUDE_ALL;
		Interceptor interceptor = bizObject.getInterceptor();
		if (interceptor != null) {
			if (logger.isDebugEnabled()) {
				logger.debug(String.format("调用业务模型 %s[%s] 中拦截器类 %s 的 beforePreAdd 方法", bizObject.getName(), bizObject.getCode(), bizObject.getInterceptor()));
			}
			result = interceptor.beforePreAdd(bizObject, parameterMap, sif);
		}

		// 执行默认的preAdd动作
		if (result == Interceptor.INCLUDE_DEFAULT || result == Interceptor.INCLUDE_ALL) {
			// 填充参数(像主从表这样的应用，通过参数填充可以将主表中的数据绑定到从表中的依赖字段上)
			Set<Entry<String, String>> set = parameterMap.entrySet();
			Iterator<Entry<String, String>> it = set.iterator();
			Entry<String, String> entry = null;
			BizField bizField = null;
			while (it.hasNext()) {
				entry = it.next();
				bizField = bizObject.getBizFieldByCode(entry.getKey());
				if (bizField != null) {
					bizField.setValue(entry.getValue());
				}
			}
			bizField = null;
			entry = null;
			it = null;
			set = null;

			// 默认值(先赋值)
			String defaultValue = null;
			String expressionparam = null;
			for (BizField field : (List<BizField>) bizObject.getBizFields()) {

				// 没有值时才需要用默认值
				if (field.getValue() != null && !StringUtils.isEmpty(field.getValue())) {
					continue;
				}

				// defaultValueAssignmentType==1，后赋值
				if (field.getDefaultValueAssignmentType() == 1) {
					continue;
				}
				// 计算默认值
				defaultValue = field.getDefaultValue();
				if (defaultValue == null || StringUtils.isEmpty(defaultValue)) {
					continue;
				}
				
				// 默认将defaultValue的值赋给value
				field.setValue(defaultValue);

				// TODO:扩展其它表达式
			}
			defaultValue = null;
			expressionparam = null;

			// 赋值，根据字段模板
			FieldTemplate fieldTemplate = null;
			FieldTemplateType fieldTemplateType = null;
			String format = null;
			for (BizField field : (List<BizField>) bizObject.getBizFields()) {
				fieldTemplate = field.getFieldTemplate();
				if (fieldTemplate == null) {
					continue;
				}
				fieldTemplateType = fieldTemplate.getType();
				if (fieldTemplateType.equals(FieldTemplateType.DATE) && fieldTemplate.getAutofill() == 1) {
					format = fieldTemplate.getFormat();
					if (format == null || StringUtils.isEmpty(format)) {
						format = DateUtils.yyyy_MM_dd;
					}
					field.setValue(DateUtils.format(DateUtils.getCurrDate(), format));
				} else if (fieldTemplateType.equals(FieldTemplateType.TIME) && fieldTemplate.getAutofill() == 1) {
					format = fieldTemplate.getFormat();
					if (format == null || StringUtils.isEmpty(format)) {
						format = DateUtils.HH_mm_ss;
					}
					field.setValue(DateUtils.format(DateUtils.getCurrDate(), format));
				} else if (fieldTemplateType.equals(FieldTemplateType.DATETIME) && fieldTemplate.getAutofill() == 1) {
					format = fieldTemplate.getFormat();
					if (format == null || StringUtils.isEmpty(format)) {
						format = DateUtils.yyyy_MM_dd_HH_mm_ss;
					}
					field.setValue(DateUtils.format(DateUtils.getCurrDate(), format));
				}
			}
			format = null;
			fieldTemplateType = null;
			fieldTemplate = null;
		}

		// preAdd后置动作 afterPreAdd
		if (result == Interceptor.INCLUDE_AFTER || result == Interceptor.INCLUDE_ALL) {
			if (interceptor != null) {
				if (logger.isDebugEnabled()) {
					logger.debug(String.format("调用业务模型 %s[%s] 中拦截器类 %s 的 afterPreAdd 方法", bizObject.getName(), bizObject.getCode(), bizObject.getInterceptor()));
				}
				interceptor.afterPreAdd(bizObject, parameterMap, sif);
			}
		}

	}

	/**
	 * 增加数据
	 * 
	 * @param parameterMap
	 *            参数对象，Map<String,String>,k:参数名，v:参数值
	 * @return
	 */
	public void add(Map<String, String> parameterMap, ServerInterface sif) throws ExceptionHandler {

		if (logger.isDebugEnabled()) {
			logger.debug("[ADD]\n" + parameterMap + "\n");
		}

		String bizCode = parameterMap.get("bizCode");
		BizObject bizObject = BizObjectContainer.get(bizCode);

		// 默认值(后赋值)
		String defaultValue = null;
		String expressionparam = null;
		String paramValue;
		for (BizField field : (List<BizField>) bizObject.getBizFields()) {

			// 没有值时才需要用默认值
			if (field.getValue() != null && !StringUtils.isEmpty(field.getValue())) {
				continue;
			}

			// defaultValueAssignmentType==1，后赋值
			if (field.getDefaultValueAssignmentType() == 0) {
				continue;
			}

			// 计算默认值
			defaultValue = field.getDefaultValue();
			if (defaultValue == null || StringUtils.isEmpty(defaultValue)) {
				continue;
			}
			
			// 默认将defaultValue的值赋给value
			field.setValue(defaultValue);
	
			// TODO:扩展其它表达式

			paramValue = parameterMap.get(field.getCode().toUpperCase());
			if (paramValue == null || StringUtils.isEmpty(paramValue)) {
				parameterMap.put(field.getCode().toUpperCase(), field.getValue());
			}
		}
		defaultValue = null;
		expressionparam = null;
		paramValue = null;

		// TODO:数据校验

		Database db = DBUtil.getDatabase();
		try {
			DML.beginTransaction(db);

			// 保存前置动作 beforeAdd
			int result = Interceptor.INCLUDE_ALL;
			Interceptor interceptor = bizObject.getInterceptor();
			if (interceptor != null) {
				if (logger.isDebugEnabled()) {
					logger.debug(String.format("调用业务模型 %s[%s] 中拦截器类 %s 的 beforeAdd 方法", bizObject.getName(), bizObject.getCode(), bizObject.getInterceptor()));
				}
				result = interceptor.beforeAdd(bizObject, parameterMap, sif, db);
			}

			// 执行默认的保存动作
			if (result == Interceptor.INCLUDE_DEFAULT || result == Interceptor.INCLUDE_ALL) {
				String[] insertSqls = bizObject.getInsertSQL();
				if (insertSqls != null) {
					List<BizField> bindBizFields = null;
					Object[] values = null;
					Object value = null;
					String insertSql = null;
					for (int i = 0; i < insertSqls.length; i++) {
						insertSql = insertSqls[i];

						// INSERT语句绑定的字段参数
						bindBizFields = (List<BizField>) bizObject.getBizFieldsBind().get("INSERT_" + i);
						if (bindBizFields != null) {
							values = new Object[bindBizFields.size()];
							for (int j = 0; j < bindBizFields.size(); j++) {
								value = getParamValue(bindBizFields.get(j), parameterMap);
								values[j] = value;
							}
						}

						if (logger.isDebugEnabled()) {
							logger.debug(insertSql);
							for (int j = 0; j < bindBizFields.size(); j++) {
								logger.debug(bindBizFields.get(j).getCode() + "--->" + bindBizFields.get(j).getAlias() + ":" + values[j]);
							}
						}

						DML.prepareExecuteUpdate(db, insertSql, values);// 预处理方式执行
					}

					bindBizFields = null;
					values = null;
					value = null;
					insertSql = null;
				}
				insertSqls = null;
			}

			// 保存后置动作 afterAdd
			if (result == Interceptor.INCLUDE_AFTER || result == Interceptor.INCLUDE_ALL) {
				if (interceptor != null) {
					if (logger.isDebugEnabled()) {
						logger.debug(String.format("调用业务模型 %s[%s] 中拦截器类 %s 的 afterAdd 方法", bizObject.getName(), bizObject.getCode(), bizObject.getInterceptor()));
					}
					interceptor.afterAdd(bizObject, parameterMap, sif, db);
				}
			}

			// 如果有上传文件，需要记录上传文件信息
			addFile(bizObject, parameterMap, db);

			DML.endTransaction(db);

			// 参数移除
			clearParameters(bizObject, parameterMap);

		} catch (Exception e) {
			DML.rollback(db);
			// 清理已上传的文件
			clearFile(bizObject, parameterMap);
			throw new ExceptionHandler(e.getMessage(), e);
		} finally {
			bizObject = null;
			bizCode = null;
			db = null;
		}

	}

	/**
	 * 修改数据前先加载数据
	 * 
	 * @param parameterMap
	 *            参数对象，Map<String,String>,k:参数名，v:参数值
	 * @return
	 * @throws ExceptionHandler
	 */
	public void preMod(BizObject bizObject, Map<String, String> parameterMap, ServerInterface sif) throws ExceptionHandler {
		if (logger.isDebugEnabled()) {
			logger.debug("[LOAD]\n" + parameterMap + "\n");
		}

		// preMod前置动作 beforePreMod
		int result = Interceptor.INCLUDE_ALL;
		Interceptor interceptor = bizObject.getInterceptor();
		if (interceptor != null) {
			if (logger.isDebugEnabled()) {
				logger.debug(String.format("调用业务模型 %s[%s] 中拦截器类 %s 的 beforePreMod 方法", bizObject.getName(), bizObject.getCode(), bizObject.getInterceptor()));
			}
			result = interceptor.beforePreMod(bizObject, parameterMap, sif);
		}

		// 执行默认的preMod动作
		if (result == Interceptor.INCLUDE_DEFAULT || result == Interceptor.INCLUDE_ALL) {
			// UPDATEQUERY语句绑定的字段参数
			Object[] values = null;
			List<BizField> bindBizFields = (List<BizField>) bizObject.getBizFieldsBind().get("UPDATEQUERY_0");
			if (bindBizFields != null) {
				values = new Object[bindBizFields.size()];
				Object value = null;
				for (int j = 0; j < bindBizFields.size(); j++) {
					value = getParamValue(bindBizFields.get(j), parameterMap);
					values[j] = value;
				}
				value = null;
			}
			// 查询数据
			List<Map<String, Object>> list = DML.prepareQuery(bizObject.getUpdateQuerySQL(), values);
			if (list.size() == 1) {
				bizObject.fillFields(list.get(0));
			}
			list = null;
			values = null;
			bindBizFields = null;
		}

		// preMod后置动作 afterPreMod
		if (result == Interceptor.INCLUDE_AFTER || result == Interceptor.INCLUDE_ALL) {
			if (interceptor != null) {
				if (logger.isDebugEnabled()) {
					logger.debug(String.format("调用业务模型 %s[%s] 中拦截器类 %s 的 afterPreMod 方法", bizObject.getName(), bizObject.getCode(), bizObject.getInterceptor()));
				}
				interceptor.afterPreMod(bizObject, parameterMap, sif);
			}
		}

	}

	/**
	 * 修改数据
	 * 
	 * @param parameterMap
	 *            参数对象，Map<String,String>,k:参数名，v:参数值
	 * @return
	 */
	public void mod(Map<String, String> parameterMap, ServerInterface sif) throws ExceptionHandler {

		if (logger.isDebugEnabled()) {
			logger.debug("[MOD]\n" + parameterMap + "\n");
		}

		String bizCode = parameterMap.get("bizCode");
		BizObject bizObject = BizObjectContainer.get(bizCode);

		Database db = DBUtil.getDatabase();
		try {
			DML.beginTransaction(db);

			// 修改前置动作 beforeMod
			int result = Interceptor.INCLUDE_ALL;
			Interceptor interceptor = bizObject.getInterceptor();
			if (interceptor != null) {
				if (logger.isDebugEnabled()) {
					logger.debug(String.format("调用业务模型 %s[%s] 中拦截器类 %s 的 beforeMod 方法", bizObject.getName(), bizObject.getCode(), bizObject.getInterceptor()));
				}
				result = interceptor.beforeMod(bizObject, parameterMap, sif, db);
			}

			// 执行默认的修改动作
			if (result == Interceptor.INCLUDE_DEFAULT || result == Interceptor.INCLUDE_ALL) {
				String[] updateSqls = bizObject.getUpdateSQL();
				if (updateSqls != null) {
					List<BizField> bindBizFields = null;
					Object[] values = null;
					Object value = null;
					String updateSql = null;
					for (int i = 0; i < updateSqls.length; i++) {
						updateSql = updateSqls[i];

						// UPDATE语句绑定的字段参数
						bindBizFields = (List<BizField>) bizObject.getBizFieldsBind().get("UPDATE_" + i);
						if (bindBizFields != null) {
							values = new Object[bindBizFields.size()];
							for (int j = 0; j < bindBizFields.size(); j++) {
								value = getParamValue(bindBizFields.get(j), parameterMap);
								values[j] = value;
							}
						}

						if (logger.isDebugEnabled()) {
							logger.debug(updateSql);
							for (int j = 0; j < bindBizFields.size(); j++) {
								logger.debug(bindBizFields.get(j).getCode() + "--->" + bindBizFields.get(j).getAlias() + ":" + values[j]);
							}
						}

						DML.prepareExecuteUpdate(db, updateSql, values);// 预处理方式执行
					}

					bindBizFields = null;
					values = null;
					value = null;
					updateSql = null;
				}
				updateSqls = null;
			}

			// 修改后置动作 afterMod
			if (result == Interceptor.INCLUDE_AFTER || result == Interceptor.INCLUDE_ALL) {
				if (interceptor != null) {
					if (logger.isDebugEnabled()) {
						logger.debug(String.format("调用业务模型 %s[%s] 中拦截器类 %s 的 afterMod 方法", bizObject.getName(), bizObject.getCode(), bizObject.getInterceptor()));
					}
					interceptor.afterMod(bizObject, parameterMap, sif, db);
				}
			}

			// 如果有上传文件，需要记录上传文件信息
			addFile(bizObject, parameterMap, db);

			// 如果有删除的文件，需要删除文件(放在事务外面)并更新记录表(事务之内)
			FieldTemplate fieldTemplate = null;
			String parameter = null;
			String delPath = null;
			String[] paths = null;
			for (BizField field : (List<BizField>) bizObject.getBizFields()) {
				fieldTemplate = field.getFieldTemplate();
				if (fieldTemplate != null && fieldTemplate.getType().equals(FieldTemplateType.FILE)) {
					parameter = field.getCode().toUpperCase() + "_DELLIST";// 记录本次删除的文件参数，临时，用完清理
					delPath = parameterMap.get(parameter);
					if (delPath != null) {
						paths = delPath.split(",");
						for (String path : paths) {
							if (path != null && !StringUtils.isEmpty(path)) {
								DML.prepareExecuteUpdate(db, "delete from " + SysFile.tableName + " where path=?", path);
							}
						}
					}
					parameterMap.remove(parameter);
				}
			}
			delPath = null;
			parameter = null;
			fieldTemplate = null;

			DML.endTransaction(db);

			// 删除磁盘文件
			if (paths != null) {
				for (String path : paths) {
					if (path != null && !StringUtils.isEmpty(path)) {
						FileHandler.del(path);
					}
				}
				paths = null;
			}

			clearParameters(bizObject, parameterMap);

		} catch (Exception e) {
			DML.rollback(db);
			// 清理已上传的文件
			clearFile(bizObject, parameterMap);
			throw new ExceptionHandler(e.getMessage(), e);
		} finally {
			bizObject = null;
			bizCode = null;
			db = null;
		}

	}

	/**
	 * 删除数据
	 * 
	 * @param parameterMap
	 *            参数对象，Map<String,String>,k:参数名，v:参数值
	 * @return
	 */
	public void del(Map<String, String> parameterMap, ServerInterface sif) throws ExceptionHandler {

		if (logger.isDebugEnabled()) {
			logger.debug("[DEL]\n" + parameterMap + "\n");
		}

		String bizCode = parameterMap.get("bizCode");
		BizObject bizObject = BizObjectContainer.get(bizCode);
		if (bizObject == null) {
			throw new ExceptionHandler(String.format("未发现业务对象，bizCode=%s", bizCode));
		}

		Database db = DBUtil.getDatabase();
		try {
			DML.beginTransaction(db);

			// 删除前置动作 beforeDel
			int result = Interceptor.INCLUDE_ALL;
			Interceptor interceptor = bizObject.getInterceptor();
			if (interceptor != null) {
				if (logger.isDebugEnabled()) {
					logger.debug(String.format("调用业务模型 %s[%s] 中拦截器类 %s 的 beforeDel 方法", bizObject.getName(), bizObject.getCode(), bizObject.getInterceptor()));
				}
				result = interceptor.beforeDel(bizObject, parameterMap, sif, db);
			}

			// 执行默认的删除动作
			if (result == Interceptor.INCLUDE_DEFAULT || result == Interceptor.INCLUDE_ALL) {
				String[] deleteSqls = bizObject.getDeleteSQL();
				if (deleteSqls != null) {
					List<BizField> bindBizFields = null;
					Object[] values = null;
					Object value = null;
					String deleteSql = null;

					// 前台传递的参数，rows 中的元素对应了datagrid中row元素
					JSONArray rows = (JSONArray) new JSONParser().parse(parameterMap.get("rows"));
					JSONObject jsonObj = null;
					for (Object obj : rows) {
						jsonObj = (JSONObject) obj;

						for (int i = 0; i < deleteSqls.length; i++) {
							deleteSql = deleteSqls[i];

							// DELETE语句绑定的字段参数
							bindBizFields = (List<BizField>) bizObject.getBizFieldsBind().get("DELETE_" + i);
							if (bindBizFields != null) {
								values = new Object[bindBizFields.size()];
								for (int j = 0; j < bindBizFields.size(); j++) {
									value = jsonObj.get(bindBizFields.get(j).getCode().toUpperCase());
									values[j] = value;
								}
							}

							if (logger.isDebugEnabled()) {
								logger.debug(deleteSql);
								for (int j = 0; j < bindBizFields.size(); j++) {
									logger.debug(bindBizFields.get(j).getCode() + "--->" + bindBizFields.get(j).getAlias() + ":" + values[j]);
								}
							}

							DML.prepareExecuteUpdate(db, deleteSql, values);// 预处理方式执行
						}

					}
					jsonObj = null;
					rows = null;
					bindBizFields = null;
					values = null;
					value = null;
					deleteSql = null;
				}
				deleteSqls = null;
			}

			// 删除后置动作 afterDel
			if (result == Interceptor.INCLUDE_AFTER || result == Interceptor.INCLUDE_ALL) {
				if (interceptor != null) {
					if (logger.isDebugEnabled()) {
						logger.debug(String.format("调用业务模型 %s[%s] 中拦截器类 %s 的 afterDel 方法", bizObject.getName(), bizObject.getCode(), bizObject.getInterceptor()));
					}
					interceptor.afterDel(bizObject, parameterMap, sif, db);
				}
			}

			// 删除记录对应的文件记录(事务内删除)和磁盘文件(事务外删除)
			List<Map<String, Object>> paths = new ArrayList<Map<String, Object>>();
			if (bizObject.isHasFileField()) {
				// 前台传递的参数，rows 中的元素对应了datagrid中row元素
				JSONArray rows = (JSONArray) new JSONParser().parse(parameterMap.get("rows"));
				JSONObject jsonObj = null;
				StringBuilder recordID = new StringBuilder();
				List<BizField> primaryFields = (List<BizField>) bizObject.getBizFieldsBind().get("PRIMARY");
				for (Object obj : rows) {
					jsonObj = (JSONObject) obj;
					if (recordID.length() > 0) {
						recordID.delete(0, recordID.length());
					}
					for (BizField bizField : primaryFields) {
						recordID.append(jsonObj.get(bizField.getCode().toUpperCase()));
					}
					// 查询出需要删除的文件路径
					paths.addAll(DML.query(db, "select path from " + SysFile.tableName + " where recordid='" + recordID + "'"));

					DML.prepareExecuteUpdate(db, "delete from " + SysFile.tableName + " where recordid=?", recordID.toString());
				}
				primaryFields = null;
			}

			DML.endTransaction(db);

			// 删除磁盘文件
			for (Map<String, Object> map : paths) {
				FileHandler.del(map.get("PATH").toString());
			}
			paths = null;

		} catch (Exception e) {
			DML.rollback(db);
			throw new ExceptionHandler(e.getMessage(), e);
		} finally {
			bizObject = null;
			bizCode = null;
			db = null;
		}

	}

	/**
	 * 查看数据前先加载数据
	 * 
	 * @param parameterMap
	 *            参数对象，Map<String,String>,k:参数名，v:参数值
	 * @return
	 * @throws ExceptionHandler
	 */
	public void view(BizObject bizObject, Map<String, String> parameterMap, ServerInterface sif) throws ExceptionHandler {
		if (logger.isDebugEnabled()) {
			logger.debug("[LOAD]\n" + parameterMap + "\n");
		}

		// view前置动作 beforeView
		int result = Interceptor.INCLUDE_ALL;
		Interceptor interceptor = bizObject.getInterceptor();
		if (interceptor != null) {
			if (logger.isDebugEnabled()) {
				logger.debug(String.format("调用业务模型 %s[%s] 中拦截器类 %s 的 beforeView 方法", bizObject.getName(), bizObject.getCode(), bizObject.getInterceptor()));
			}
			result = interceptor.beforeView(bizObject, parameterMap, sif);
		}

		// 执行默认的view动作
		if (result == Interceptor.INCLUDE_DEFAULT || result == Interceptor.INCLUDE_ALL) {
			// UPDATEQUERY语句绑定的字段参数
			Object[] values = null;
			List<BizField> bindBizFields = (List<BizField>) bizObject.getBizFieldsBind().get("VIEW_0");
			if (bindBizFields != null) {
				values = new Object[bindBizFields.size()];
				Object value = null;
				for (int j = 0; j < bindBizFields.size(); j++) {
					value = getParamValue(bindBizFields.get(j), parameterMap);
					values[j] = value;
				}
				value = null;
			}
			// 查询数据
			List<Map<String, Object>> list = DML.prepareQuery(bizObject.getViewSQL(), values);
			if (list.size() == 1) {
				bizObject.fillFields(list.get(0));
			}
			list = null;
			values = null;
			bindBizFields = null;
		}

		// view后置动作 afterView
		if (result == Interceptor.INCLUDE_AFTER || result == Interceptor.INCLUDE_ALL) {
			if (interceptor != null) {
				if (logger.isDebugEnabled()) {
					logger.debug(String.format("调用业务模型 %s[%s] 中拦截器类 %s 的 afterView 方法", bizObject.getName(), bizObject.getCode(), bizObject.getInterceptor()));
				}
				interceptor.afterView(bizObject, parameterMap, sif);
			}
		}

	}

	/**
	 * 获取参数值
	 * 
	 * @param bizField
	 * @param parameterMap
	 * @return
	 */
	private Object getParamValue(BizField bizField, Map<String, String> parameterMap) throws ExceptionHandler {
		String bizFieldCode = bizField.getCode();
		String strValue = parameterMap.get(bizFieldCode.toUpperCase());
		if (strValue == null) {
			return null;
		}
		Object value = null;
		// 数据类型判断
		DataType dataType = bizField.getType();
		if (dataType.equals(DataType.INT2) || dataType.equals(DataType.INT4)) {
			// 整形
			if (StringUtils.isEmpty(strValue)) {
				value = null;
			} else {
				if (!StringUtils.isInteger(strValue)) {
					throw new ExceptionHandler(String.format("参数：%s[%s]，数据类型为 %s ，参数值为：%s，与类型不一致！", bizField.getName(), bizField.getCode(), dataType, strValue));
				}
				value = StringUtils.intValue(strValue);
			}
		} else if (dataType.equals(DataType.INT8)) {
			// 长整形
			if (StringUtils.isEmpty(strValue)) {
				value = null;
			} else {
				if (!StringUtils.isLong(strValue)) {
					throw new ExceptionHandler(String.format("参数：%s[%s]，数据类型为 %s ，参数值为：%s，与类型不一致！", bizField.getName(), bizField.getCode(), dataType, strValue));
				}
				value = StringUtils.longValue(strValue);
			}
		} else if (dataType.equals(DataType.DECIMAL)) {
			// 数值型
			if (!StringUtils.isDecimal(strValue)) {
				throw new ExceptionHandler(String.format("参数：%s[%s]，数据类型为 %s ，参数值为：%s，与类型不一致！", bizField.getName(), bizField.getCode(), dataType, strValue));
			}
			value = StringUtils.decimalValue(strValue);
		} else if (dataType.equals(DataType.DATE)) {
			// 日期型
			if (StringUtils.isEmpty(strValue)) {
				value = null;
			} else {
				value = new Date(DateUtils.parse(strValue).getTime());
			}
		} else if (dataType.equals(DataType.TIME)) {
			// 时间型
			if (StringUtils.isEmpty(strValue)) {
				value = null;
			} else {
				value = Time.valueOf(strValue);
			}
		} else if (dataType.equals(DataType.DATETIME)) {
			// 日期时间型
			if (StringUtils.isEmpty(strValue)) {
				value = null;
			} else {
				value = Timestamp.valueOf(strValue);
			}
		} else if (dataType.equals(DataType.CHAR) || dataType.equals(DataType.VARCHAR)) {
			// 字符串型
			value = strValue.trim();
		} else if (dataType.equals(DataType.CLOB)) {
			// CLOB
			value = strValue.trim();
		} else if (dataType.equals(DataType.BLOB)) {
			// BLOB
			// TODO
		}
		return value;
	}

	/**
	 * 记录上传文件信息
	 * 
	 * @param bizObject
	 *            业务对象
	 * @param parameterMap
	 *            参数
	 * @param db
	 *            数据库实例
	 * @throws ExceptionHandler
	 */
	private void addFile(BizObject bizObject, Map<String, String> parameterMap, Database db) throws ExceptionHandler {
		if (!bizObject.isHasFileField()) {
			return;
		}

		FieldTemplate fieldTemplate = null;
		String parameter = null;
		String newpath = null;
		String[] paths = null;
		String[] fileInfo = null;
		String recordID = "";
		List<BizField> primaryFields = (List<BizField>) bizObject.getBizFieldsBind().get("PRIMARY");
		for (BizField bizField : primaryFields) {
			recordID += parameterMap.get(bizField.getCode().toUpperCase());
		}
		primaryFields = null;
		for (BizField field : (List<BizField>) bizObject.getBizFields()) {
			fieldTemplate = field.getFieldTemplate();
			if (fieldTemplate != null && fieldTemplate.getType().equals(FieldTemplateType.FILE)) {
				parameter = field.getCode().toUpperCase() + "_NEWFILE";// 记录本次新增的文件参数，临时，用完清理(dragon.core.util.Handler.getParameterMap()中设置)
				newpath = parameterMap.get(parameter);
				// 单个文件路径由3部分组成(bizCode\{35位的随机文件名}:真实文件名)，例如：(employee\6621839f_1397b3027b5__7ffb_00000014:Activiti 5.8 用户指南（中文版）.pdf)
				if (newpath != null) {
					paths = newpath.split(",");
					for (String path : paths) {
						if (path != null && !StringUtils.isEmpty(path)) {
							fileInfo = path.split(":");
							DML.prepareExecuteUpdate(db, "insert into " + SysFile.tableName + "(path,name,recordid) values(?,?,?)", fileInfo[0], fileInfo[1], recordID);
						}
					}
				}
				// parameterMap.remove(parameter);
			}
		}
		recordID = null;
		fileInfo = null;
		paths = null;
		newpath = null;
		fieldTemplate = null;
	}

	/**
	 * 清理参数
	 * 
	 * @param bizObject
	 *            业务对象
	 * @param parameterMap
	 *            参数
	 */
	private void clearParameters(BizObject bizObject, Map<String, String> parameterMap) {
		FieldTemplateType fieldTemplateType = null;
		for (BizField field : (List<BizField>) bizObject.getBizFields()) {
			if (field.getFieldTemplate() != null) {
				fieldTemplateType = field.getFieldTemplate().getType();
				// 需要移除大文本(字段模板采用：富文本)
				if (fieldTemplateType.equals(FieldTemplateType.RICHTEXT)) {
					parameterMap.remove(field.getCode().toUpperCase());
				}
			}
		}
		parameterMap.remove("bizCode");// 如果不移除此参数，则将parameterMap返回给增加页面后，如果增加页面继续调用修改页面，会导致报错，因为列表页面中的修改函数中已经存在此参数。
		fieldTemplateType = null;
	}

	/**
	 * 失败后清除上传的文件
	 * 
	 * @param bizObject
	 *            业务对象
	 * @param parameterMap
	 *            参数
	 */
	private void clearFile(BizObject bizObject, Map<String, String> parameterMap) {
		FieldTemplate fieldTemplate = null;
		String parameter = null;
		String filePath = null;
		String[] paths = null;
		String[] fileInfo = null;
		for (BizField field : (List<BizField>) bizObject.getBizFields()) {
			fieldTemplate = field.getFieldTemplate();
			if (fieldTemplate != null && fieldTemplate.getType().equals(FieldTemplateType.FILE)) {
				parameter = field.getCode().toUpperCase() + "_NEWFILE";// 记录本次新增的文件参数，临时，用完清理(dragon.core.util.Handler.getParameterMap()中设置)
				filePath = parameterMap.get(parameter);
				// 单个文件路径由3部分组成(bizCode\{35位的随机文件名}:真实文件名)，例如：(employee\6621839f_1397b3027b5__7ffb_00000014:Activiti 5.8 用户指南（中文版）.pdf)
				if (filePath != null) {
					paths = filePath.split(",");
					for (String path : paths) {
						if (path != null && !StringUtils.isEmpty(path)) {
							fileInfo = path.split(":");
							FileHandler.del(fileInfo[0]);
						}
					}
				}
				// parameterMap.remove(parameter);
			}
		}
		fileInfo = null;
		paths = null;
		filePath = null;
		parameter = null;
		fieldTemplate = null;
	}

}
